//
//  SHRequestManager.h
//  JiFengDaRen
//
//  Created by SH_iOS on 2018/1/30.
//  Copyright © 2018年 SH_iOS. All rights reserved.
//
/*** 网络请求基类 ***/
#import <Foundation/Foundation.h>

/*! 定义请求成功的 block */
typedef void ( ^ SHResponseSuccess)(id result);

/*! 定义请求失败的 block */
typedef void ( ^ SHResponseFailure)(NSError * error);

/*! 定义上传进度 block */
typedef void ( ^ SHUploadProgress)(int64_t bytesProgress,int64_t totalBytesProgress);
/*! 定义下载进度 block */
typedef void ( ^ SHDownloadProgress)(int64_t bytesProgress,
                                          int64_t totalBytesProgress);

/*！定义请求类型的枚举 */
typedef NS_ENUM( NSUInteger, SHRequestType )
{
    /*! get请求 */
    SHRequestGET = 0,
    /*! post请求 */
    SHRequestPOST,
    /*! put请求 */
    SHRequestPUT,
    /*! delete请求 */
    SHRequestDELETE
    
};

/*！定义请求数据格式的枚举 */
typedef NS_ENUM( NSUInteger,SHHttpRequestSerializer )
{
    /** 设置请求数据为JSON格式*/
    SHHttpRequestSerializerJSON,
    /** 设置请求数据为HTTP格式*/
    SHHttpRequestSerializerHTTP,
    
};

/*！定义响应数据格式的枚举 */
typedef NS_ENUM( NSUInteger, SHHttpResponseSerializer )
{
    /** 设置响应数据为JSON格式*/
    SHHttpResponseSerializerJSON,
    /** 设置响应数据为HTTP格式*/
    SHHttpResponseSerializerHTTP,
    
};




@class SHRequestEntity;
@class AFHTTPSessionManager;
@interface SHRequestManager : NSObject

/**
 创建的请求的超时间隔（以秒为单位），此设置为全局统一设置一次即可，
 默认超时时间间隔为30秒。
 */
@property (nonatomic, assign) NSTimeInterval timeoutInterval;

/**
设置网络请求参数的格式，此设置为全局统一设置一次即可，
默认：XDHttpRequestSerializerJSON
*/
@property (nonatomic, assign) SHHttpRequestSerializer requestSerializer;

/**
 设置服务器响应数据格式，此设置为全局统一设置一次即可，默认：XDHttpResponseSerializerJSON
 */
@property (nonatomic, assign) SHHttpResponseSerializer responseSerializer;


/**
 自定义请求头：requestHeader
 */
@property(nonatomic, copy) NSDictionary *requestHeader;

/*!
 *  获得全局唯一的网络请求实例单例方法
 *
 *  @return 网络请求管理类单例
 */
+ (instancetype)sharedRequestManager;



/**
 网络请求的实例方法 get
 
 @param entity  请求信息载体
 @param success 请求成功的回调
 @param failure 请求失败的回调
 @return AFHTTPRequestOperation
 */
+ (NSURLSessionTask *)GETWithEntity:(SHRequestEntity *)entity
                                  success:(SHResponseSuccess)success
                                  failure:(SHResponseFailure)failure
                                 progress:(SHDownloadProgress)progress;


/**
 网络请求的实例方法 post
 
 @param entity  请求信息载体
 @param success 请求成功的回调
 @param failure 请求失败的回调
 @return AFHTTPRequestOperation
 */
+ (NSURLSessionTask *)POSTWithEntity:(SHRequestEntity *)entity
                             success:(SHResponseSuccess)success
                             failure:(SHResponseFailure)failure
                            progress:(SHDownloadProgress)progress;



/**
 网络请求的实例方法 put
 
 @param entity  请求信息载体
 @param success 请求成功的回调
 @param failure 请求失败的回调
 @return AFHTTPRequestOperation
 */
+ (NSURLSessionTask *)PUTWithEntity:(SHRequestEntity *)entity
                                  success:(SHResponseSuccess)success
                                  failure:(SHResponseFailure)failure
                                 progress:(SHDownloadProgress)progress;


/**
 网络请求的实例方法 delete
 
 @param entity  请求信息载体
 @param success 请求成功的回调
 @param failure 请求失败的回调
 @return AFHTTPRequestOperation
 */
+ (NSURLSessionTask *)DELETEWithEntity:(SHRequestEntity *)entity
                                     success:(SHResponseSuccess)success
                                     failure:(SHResponseFailure)failure
                                    progress:(SHDownloadProgress)progress;
;

/**
 上传图片(多图)
 
 @param entity 请求信息载体
 @param successBlock 上传成功的回调
 @param failureBlock 上传失败的回调
 @param progressBlock 上传进度
 @return XDURLSessionTask
 */
/*
 + (XDURLSessionTask *)xd_uploadImageWithEntity:(XDRequestDataEntity *)entity
 successBlock:(XDResponseSuccessBlock)successBlock
 failurBlock:(XDResponseFailBlock)failureBlock
 progressBlock:(XDUploadProgressBlock)progressBlock;
 */
/**
 视频上传
 
 @param entity 请求信息载体
 @param successBlock 成功的回调
 @param failureBlock 失败的回调
 @param progressBlock 上传的进度
 */
/*
 + (void)xd_uploadVideoWithEntity:(XDRequestDataEntity *)entity
 successBlock:(XDResponseSuccessBlock)successBlock
 failureBlock:(XDResponseFailBlock)failureBlock
 progressBlock:(XDUploadProgressBlock)progressBlock;
 */

/**
 文件下载
 
 @param entity 请求信息载体
 @param successBlock 下载文件成功的回调
 @param failureBlock 下载文件失败的回调
 @param progressBlock 下载文件的进度显示
 @return XDURLSessionTask
 */
/*
 + (XDURLSessionTask *)xd_downLoadFileWithEntity:(XDRequestDataEntity *)entity
 successBlock:(XDResponseSuccessBlock)successBlock
 failureBlock:(XDResponseFailBlock)failureBlock
 progressBlock:(XDDownloadProgressBlock)progressBlock;
 
 */
/**
 文件上传
 
 @param entity 请求信息载体
 @param successBlock successBlock description
 @param failureBlock failureBlock description
 @param progressBlock progressBlock description
 @return XDURLSessionTask
 */
/*
 + (XDURLSessionTask *)xd_uploadFileWithWithEntity:(XDRequestDataEntity *)entity
 successBlock:(XDResponseSuccessBlock)successBlock
 failureBlock:(XDResponseFailBlock)failureBlock
 progressBlock:(XDUploadProgressBlock)progressBlock;
 */



#pragma mark - 网络请求的类方法 --- get / post / put / delete 基类
/*!
 *  网络请求的实例方法
 *
 *  @param type            get / post / put / delete
 *  @param isNeedCache     是否需要缓存，只有 get / post 请求有缓存配置
 *  @param isNeedRsaEncode 是否需要rsa加密 post put 请求body需要加密
 *  @param isNeedRsaDecode 是否需要rsa解密 返回的内容一般需要解密
 *  @param urlString       请求的地址
 *  @param parameters      请求的参数
 *  @param success    请求成功的回调
 *  @param failure    请求失败的回调
 *  @param progress  进度
 */
+ (NSURLSessionTask *)requestWithType:(SHRequestType)type
                                cache:(BOOL)cache
                              encrypt:(BOOL)encrypt
                               decode:(BOOL)decode
                            urlString:(NSString *)urlString
                           parameters:(id)parameters
                              success:(SHResponseSuccess)success
                              failure:(SHResponseFailure)failure
                             progress:(SHDownloadProgress)progress;



#pragma mark - 自定义请求头
/**
 *  自定义请求头
 */
+ (void)setValue:(NSString *)value forHTTPHeaderKey:(NSString *)HTTPHeaderKey;

/**
 删除所有请求头
 */
+ (void)clearAuthorizationHeader;

#pragma mark - 取消 Http 请求
/*!
 *  取消所有 Http 请求
 */
+ (void)cancelAllRequest;

/*!
 *  取消指定 URL 的 Http 请求
 */
+ (void)cancelRequestWithURL:(NSString *)URL;

/**
 清空缓存：此方法可能会阻止调用线程，直到文件删除完成。
 */
- (void)clearAllHttpCache;

@end
